'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.04
 * lastUpdateDate：2018.02.04
 * description：Promise的诞生来解决异步式嵌套回调的问题
 */
// for example：
/**
 * Promise本身接收两个参数，一个是resolve函数，一个是reject函数
 * resolve函数表示接收过程当中有了正确结果之后会去调用它，并且把正确结果传导给它
 * reject函数表示接收过程当中有了错误结果之后会去调用它，并且把错误结果传导给它
 * new Promise ((resolve, reject) => {
 *
 * });
 */
function asyncFun (a, b) {
    return new Promise ((resolve, reject) => {
        // 加点逻辑判断
        if (typeof a !== 'number' || typeof b !== 'number') {
            reject (new Error('a or b is not a number!'));
        }

        // 用setTimeout来模拟异步请求
        setTimeout(function () {
            resolve (a + b);
        }, 200)
    });
}

// 使用Promise解决异步回调问题
/**
 * 1.那么当我们调用这个asyncFun()函数的时候，它返回的是一个Promise，
 * 也就是说无论它返回的是一个成功的Promise还是错误的Promise，那么
 * 它的then方法就会被执行，then函数的第一个参数就是Promise对象成功
 * 的回调，第二个参数就是Promise对象失败的回调，这个要理解好
 * 2.从逻辑的清晰度上，用then的方式一步步的运算，相对通过不断嵌套式
 * 的回调方式更加优雅，而且逻辑更加的清晰
 */
// 下面的写法进行串行化处理
// let resultList = [];
// asyncFun (100, 200)
//     .then ((result) => {
//         resultList.push(result);
//         return asyncFun (200, 300);
//     })
//     .then ((result) => {
//         resultList.push(result);
//         return asyncFun (300, 400);
//     })
//     .then ((result) => {
//         resultList.push(result);
//         // console.log(resultList);
//         var sum = 0;
//         for ( let i = 0; i < resultList.length; i++ ) {
//             // console.log(resultList[i]);
//             sum += resultList[i];
//         }
//         console.log(sum);
//     })
//     .catch ((error) => {
//         console.log(`${error}`);
//     });
/**
 * Promise.all(asyncFun (100, 200), asyncFun (200, 300),...)可以传入多个，
 * 返回的是组装后的一个全新的Promise对象，注意当其中一个传入的对象是不符合规范的，
 * 那么就会抛出异常，捕获用reject()方式或者catch方式
 * 所以上面的程序可以像下面改写，如下所示：
 */
let promise = Promise.all([asyncFun (100, 200), asyncFun (200, 300), asyncFun (300, 400)]);
promise
    .then ((resultList) => {
        // console.log(resultList);
        let sum = 0;
        for ( let i = 0; i < resultList.length; i++ ) {
            sum += resultList[i];
        }
        console.log(sum);
    })
    .catch ((error) => console.log(`${error}`));
